/*
go语言和oop语言（Java、Python）的不同之处：
1. 不支持方法重载
2. 不支持静态方法
*/
package main

import (
	"fmt"
	_ "encoding/json"
)

// 定义一个结构体
type Student struct{
	Name string
	age int
}

func (s *Student)hello(msg string) {
	fmt.Println("【"+ s.Name +"】say hello!")
}

// 一个动物的结构体
type Animal struct {

}

// 小学生
// 当匿名结构体和当前机构体命名冲突的时候
// 按照“就近原则”使用最近的一个变量的值
type Pupil struct {
	Student // 使用匿名结构体
	// Animal // 多个继承也是可以的，但是多继承会引起变量混乱，一遍不建议这样做
}

// 中学生
type JuniorHighSchool struct {
	Student
}

func main() {
	// 直接初始化赋值也是可以的
	// var p12 Pupil = Pupil{Student{"小白", 20}}
	var p1 Pupil = Pupil{}
	p1.Student.Name = "小明"
	p1.Student.age = 18 // 可以直接给匿名结构体的变量赋值
	fmt.Println("p1 = ", p1)//p1 =  {{小明 18}}
	fmt.Println("***** 分割线 *****")
	fmt.Println("p1.Student.Name = ", p1.Student.Name)//p1.Student.Name =  小明
	fmt.Println("p1.Name = ", p1.Name)//p1.Name =  小明
	// 两种写法都是可以的，编译器会自动寻找 Name 的变量看是在内部的匿名结构体还是在当前结构体




}
